import Web3 from 'web3'

// 调用 `computedSelleCNY` 函数
export const computedBuyeCNYApi = async (ETHNumber) => {
    if (ETHNumber < 0.008) {
        console.log("最少充值0.008ETH")
        return
    }
    // 设置提供者 (例如通过 Infura 或本地节点)
    const web3 = new Web3("wss://sepolia.infura.io/ws/v3/fa1d6f1a4b2447bfa0932c9fb0a35a9f");

    // 合约地址和 ABI
    const contractAddress = '0x20Aa6C3F101B6246326b7DDe2a0dbC7EbB621308'; // 替换为实际的合约地址
    const contractABI = [
        {
            "inputs": [
                {
                    "internalType": "uint256",
                    "name": "ETHNumber",
                    "type": "uint256"
                }
            ],
            "name": "computedBuyeCNY",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        }
    ];

    // 创建合约实例
    const contract = new web3.eth.Contract(contractABI, contractAddress);
    try {
        // 调用合约的 view 函数
        const result = await contract.methods
            .computedBuyeCNY(Web3.utils.toWei(ETHNumber.toString(), 'ether'))  // ETHNumber 转换为 Wei
            .call();

        console.log(`The computed CNY value for ${ETHNumber} tokens is: ${result}`);
        
        // 将返回值传入 TokenToDisplayValue 进行显示转换
        return TokenToDisplayValue(result);
    } catch (error) {
        console.error('Error calling computedBuyeCNY:', error);
    }
}

// 代币的最小单位：6位小数
const TOKEN_DECIMALS = 6;

// 将代币的最小单位值转换为带 6 位小数的真实值
export const TokenToDisplayValue = (number) => {
    if (number == 0) return 0;

    // 如果传入的是 BigInt 类型，先将其转换为 Number 类型
    const value = Number(number) / Math.pow(10, TOKEN_DECIMALS);

    // 保留 2 位小数
    let formattedValue = value.toFixed(2);

    // 如果值大于1亿，转换为科学计数法
    return parseFloat(formattedValue) > 1e8 ? parseFloat(formattedValue).toExponential(2) : formattedValue;
};
